package com.example.demo08rabbitmq.service;

import com.example.demo08rabbitmq.bean.Person;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;

//@Service
public class PersonService {

    public static final String QUEUE_ATGUIGU_NEWS = "atguigu.news";
    public static final String QUEUE_ATGUIGU_EMPS = "atguigu.emps";

    /**
     * 当队列 "atguigu.news" 中有了消息之后，这个方法就会自动调用;
     * 自动调用的前提条件是开启基于注解的 Rabbit 模式 {@link EnableRabbit}
     * 测试:
     * 1. 开启此应用
     * 2. 用单元测试来验证
     * 测试地址 {@link com.example.demo08rabbitmq.Demo08RabbitmqApplicationTests#sendPersonService()}
     */
    @RabbitListener(queues = {QUEUE_ATGUIGU_NEWS})
    public void receive(Person person) {
        System.out.println("收到的消息: " + person);
    }

    /**
     * 上边的方法直接是拿到了消息体中的内容，如果要想拿到消息头中的内容，我们需要在形参中写
     * {@link Message}
     * 测试地址 {@link com.example.demo08rabbitmq.Demo08RabbitmqApplicationTests#sendPersonService02()}
     */
    @RabbitListener(queues = {QUEUE_ATGUIGU_EMPS})
    public void receive02(Message message) {
        // TODO: 拿到的是字节数组，没有将收到的消息进行序列化
        byte[] body = message.getBody();
        System.out.println(new String(body, StandardCharsets.UTF_8));
        System.out.println(message.getMessageProperties());
    }


    /**
     * Hello World 工作模型
     * Work 工作模型
     */
    // 声明一个队列(默认=持久化+非独占+非自动删除)
    @RabbitListener(queuesToDeclare = {@Queue(value = "队列名字", durable = "true", exclusive = "false", autoDelete = "false")})
    public void receive3(Message message) {

    }

    /**
     * 发布订阅(fanout) 工作模型
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(value = "交换机名字", type = "交换机类型") // 创建交换机
            )
    })
    public void receive4(Message message) {

    }

    /**
     * routing(路由) 工作模型
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(value = "交换机名字", type = "交换机类型"), // 创建交换机
                    key = {"red", "black", "white"}
            )
    })
    public void receive5(Message message) {

    }

    /**
     * routing(路由) 工作模型
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue, // 创建临时队列
                    exchange = @Exchange(value = "交换机名字", type = "交换机类型"), // 创建交换机
                    key = {"order.*", "user.*", "stock"}
            )
    })
    public void receive6(Message message) {

    }

}
